/*********************************************************
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.http.enging;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 * 
 * @createTime: Jun 28, 2013 3:55:58 PM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime:
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum:
 * 
 */
public class HttpServer extends Thread {
	private byte[] content;
	private byte[] header;
	private int port = 80;

	@SuppressWarnings("unused")
	private HttpServer(String data, String encoding, String MIMEType,
			int port) throws UnsupportedEncodingException {
		this(data.getBytes(encoding), encoding, MIMEType, port);
	}

	public HttpServer(byte[] data, String encoding, String MIMEType,
			int port) throws UnsupportedEncodingException {
		this.content = data;
		this.port = port;
		String header = "HTTP/1.0 200 OK\r\n" + "Server: OneFile 1.0\r\n"
				+ "Content-length: " + this.content.length + "\r\n"
				+ "Content-type: " + MIMEType + "\r\n\r\n";
		this.header = header.getBytes("ASCII");
	}

	public void run() {
		try {
			ServerSocket server = new ServerSocket(this.port);
			System.out.println("Accepting connections on port "
					+ server.getLocalPort());
			System.out.println("Data to be sent:");
			System.out.write(this.content);

			while (true) {
				Socket connection = null;
				try {
					connection = server.accept();
					OutputStream out = new BufferedOutputStream(connection
							.getOutputStream());
					InputStream in = new BufferedInputStream(connection
							.getInputStream());

					StringBuffer request = new StringBuffer();
					while (true) {
						int c = in.read();
						if (c == '\r' || c == '\n' || c == -1) {
							break;
						}
						request.append((char) c);

					}

					// 如果检测到是HTTP/1.0及以后的协议，按照规范，需要发送一个MIME首部
					if (request.toString().indexOf("HTTP/") != -1) {
						out.write(this.header);
					}

					out.write(this.content);
					out.flush();

				} catch (IOException e) {
					// TODO: handle exception
				} finally {
					if (connection != null) {
						connection.close();
					}
				}
			}

		} catch (IOException e) {
			System.err.println("Could not start server. Port Occupied");
		}
	}

	public static void main(String[] args) {
		try {
			String contentType = "text/xml";
			String data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><CodeMakeAndSendRes><TransactionID>20000000000000000020000000004011</TransactionID><SPID>20</SPID><Status><StatusCode>10014</StatusCode><StatusText>辅助码号已存在</StatusText></Status><TransactionTime>2013-06-28 15:59:56</TransactionTime><ResData><PicData/><AssistNumber/></ResData><CPCCode></CPCCode></CodeMakeAndSendRes>";

			// 设置监听端口
			int port;
			try {
				port = Integer.parseInt(args[1]);
				if (port < 1 || port > 65535) {
					port = 8087;
				}
			} catch (Exception e) {
				port = 8087;
			}

			String encoding = "UTF-8";

			Thread t = new HttpServer(data, encoding, contentType,
					port);
			t.start();

		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
			System.out.println("Usage:java SingleFileHTTPServer filename port encoding");
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println(e);// TODO: handle exception
		}
	}
}
